package Plugins

import (
	"fmt"
	"github.com/shadow1ng/fscan/common"
	"io/ioutil"
	"net/http"
	"os"
	"strings"
	"time"
	//"sync"
)

func MainScan(cfgYml common.ConfigYml, Info common.HostInfo) {
	//设置代理
	//uri, err := url.Parse("http://username:password@inproxy.sjtu.edu.cn:8000")
	//client := http.Client{
	//	Transport: &http.Transport{
	//		// 设置代理
	//		Proxy: http.ProxyURL(uri),
	//	},
	//}
	//var wg sync.WaitGroup
	defer func() { //必须要先声明defer，否则不能捕获到panic异常
		fmt.Println("defer start")
		if err := recover(); err != nil {
			fmt.Println("此轮定时任务报错：", err) //这里的err其实就是panic传入的内容，"bug"
		}
		fmt.Println("defer end")
	}()
	//扫描开始时间
	t1 := time.Now()
	//删除保存扫描信息文件，重新生成，只保留当前次扫描信息
	del := os.Remove("result.txt")
	if del != nil {
		fmt.Printf("clear %s error, %v\n", common.Outputfile, del)
	}
	res, err := http.Get(cfgYml.Url)
	if err != nil {
		fmt.Println(err.Error())
		return
	}
	robots, err := ioutil.ReadAll(res.Body)
	res.Body.Close()
	if err != nil {
		fmt.Println(err.Error())
		return
	}
	laninfo := string(robots)
	fmt.Println("请求返回扫描IP数据：", laninfo)
	if strings.Compare(laninfo, "") == 0 {
		return
	}
	begin := strings.Index(laninfo, "[") + 1
	end := strings.Index(laninfo, "]")
	s := laninfo[begin:end]
	arr := strings.Split(s, ",")
	//Info.Host = "127.0.0.1"
	//common.Parse(&Info)
	//将返回的ip地址逐个进行扫描
	//for _, host := range arr {
	//	wg.Add(1)
	//	var Hinfo=&Info
	//	go func(host string,Hinfo common.HostInfo) {
	//	Info.Host = strings.ReplaceAll(host, "\"", "")
	//	Scan(Info)
	//	print("scan end\n")
	//	}(host,*Hinfo)
	//}
	//wg.Wait()
	for i := 0; i < len(arr); i++ {
		Info.Host = strings.ReplaceAll(arr[i], "\"", "")
		common.Parse(&Info)
		Scan(Info)
		print("IP:" + arr[i] + "扫描结束\n")
	}
	//关闭管道
	//CloseResult()
	//改用http post请求将扫描数据传给接口
	//if cfgYml.RedisCache != nil {
	//	//当有配置信息时才进行redis数据保存
	//common.NewClient(&cfgYml)
	//	//将符合要求的数据保存到rdis中
	//	common.SaveData(common.RiskInfos)
	//}
	//common.CloseClient()
	jsonStr := common.ToJson()
	t2 := time.Now()
	//扫描完后没发现漏洞信息则不请求发送接口
	if strings.Compare(jsonStr, "") != 0 {
		fmt.Printf("============请求地址%s post发送Json字符串数据：%s\n", cfgYml.PostUrl, jsonStr)
		resp, err := http.Post(cfgYml.PostUrl,
			"text/plain",
			strings.NewReader(jsonStr))
		if err != nil {
			fmt.Println(err)
		}

		body, err := ioutil.ReadAll(resp.Body)
		if err != nil {
			fmt.Println(err)
		}

		resp.Body.Close()

		//扫描结束时间
		fmt.Printf("开始扫描时间：%s\n 此次扫描耗时：%.2f分钟\n 请求返回信息：%s\n ", t1.Format("2006-01-02 15:04:05"), t2.Sub(t1).Seconds()/60, string(body))
	} else {
		fmt.Printf("开始扫描时间：%s\n 此次扫描耗时：%.2f分钟\n 暂无发现漏洞信息", t1.Format("2006-01-02 15:04:05"), t2.Sub(t1).Seconds()/60)
	}
	return
}
